package org.fujay.langchain4jserver.domain.conversation.repository;

import org.fujay.langchain4jserver.domain.conversation.entity.MessageEntity;
import org.fujay.langchain4jserver.domain.conversation.vo.ConversationId;
import org.fujay.langchain4jserver.domain.conversation.vo.MessageId;

import java.util.List;
import java.util.Optional;

/**
 * 消息仓储接口 (辅助会话聚合)
 */
public interface MessageRepository {

    /**
     * 根据消息ID查找消息
     *
     * @param id 消息ID
     * @return 消息实体 Optional
     */
    Optional<MessageEntity> findById(MessageId id);

    /**
     * 根据会话ID查找所有消息 (主要由 ConversationRepository 在加载聚合根时调用)
     *
     * @param conversationId 会话ID
     * @return 消息列表
     */
    List<MessageEntity> findByConversationId(ConversationId conversationId);

    /**
     * 保存单个消息 (通常由聚合根的 save 方法触发)
     *
     * @param message        消息实体
     * @param conversationId 关联的会话ID
     */
    void save(MessageEntity message, ConversationId conversationId);

    /**
     * 批量保存消息 (用于聚合根保存)
     *
     * @param messages       消息列表
     * @param conversationId 关联的会话ID
     */
    void saveAll(List<MessageEntity> messages, ConversationId conversationId);

    /**
     * 根据消息ID删除消息
     *
     * @param id 消息ID
     */
    void deleteById(MessageId id);

    /**
     * 根据会话ID删除所有消息
     *
     * @param conversationId 会话ID
     */
    void deleteByConversationId(ConversationId conversationId);

    /**
     * 生成下一个消息ID
     *
     * @return 新的消息ID
     */
    MessageId nextId();
}
